import Vue from 'vue';

/**
 * @description 触发器信息状态管理,使用时导入后直接用就行，如果要在模板中使用state则需要在computed属性中去定义state
 * @example
 * <template>
 *     <div>{{ state }}</div>
 * </template>
 * <script>
 * import state from '@src/modules/trigger/view/setting/util/state.js'
 * export default {
 *     computed: {
 *         state() {
 *             return state;
 *         }
 *     }
 * }
 * </script>
 * @description 如果要给state新增属性，请使用$set，否则可能会失去响应式
 * @example this.$set(state, 'newProp', value);
 */

// 单一状态对象
const state = Vue.observable({
    trigger_code_gray: false, // 代码块的灰度
    editStatus: false, // false表示新建状态 true表示编辑状态
    // 统一状态数据
    data: {
        changeOpenPanel: false, // 右边设置抽屉页面显示状态
        kind: 0, // 显示不同配置页面 1 表示应用 2表示条件 3表示执行动作 4表示代码页面 5表示消息通知
    },
    currentNodeInfoFront: { // 当前节点前端信息
        uniqueId: '', // 当前节点的唯一id
        options: { // 当前节点配置信息
            // type, // 这里的type只存在于当前节点是消息节点/代码节点，其他情况没有这个type
            /**
             * 开始节点的配置信息
             * appId: '', // 应用id
             * appLogo: '', // 应用logo
             * appName: '', // 应用名称
             * apiId: '', // api的id，消息通知和代码分别传message和code
             * apiName: '', // api的名称
             * moduleId: '', // 选择的api类型
             * selectObjName: '', // 选择的类型加api名称
             */
            /**
             * 条件节点的配置信息
             * convertType: '', // 触发条件的类型 mapping/code
             * convertCode: '', // 选择code类型时的code信息
             * conditionList: [ // 选择mapping类型时的信息
             *     [
             *         {
             *             toEnName: '', // 条件
             *             operate: '', // 判断符
             *             valueType: '', // 固定值/对应字段/来源api
             *             value: [], // 选择的值
             *         }
             *     ]
             * ],
             */
            /**
             * 消息通知节点的配置信息
             * apiId: 'message', // 固定写死
             * fieldOptions: { // 消息通知的配置信息，除了side，其他已省略，用的消息通知的组件
             *     side: 0, // 0表示内部通知，1表示外部通知
             * },
             */
            /**
             * 代码节点的配置信息
             * apiId: 'code', // 固定写死
             * fieldOptions: { // 代码的配置信息
             *     convertCode: '', // 代码
             * },
             */
            /**
             * 执行动作的配置信息
             * apiAction: '', // 选择的api对应类型：新增/编辑/删除
             * apiId: '', // api的id
             * apiName: '', // api的名称
             * appId: '', // 应用id
             * appLogo: '', // 应用logo
             * appName: '', // 应用名称
             * moduleId: '', // 选择的api类型
             * selectObjName: '' // 选择的类型加api名称
             * fieldOptions: {
             *     // 当nodeList.apiId对应的action为INSERT时
             *     convertType: '', // 执行动作的类型 mapping/code
             *     insert: [ 
             *         {
             *             toEnName: '', // 字段
             *             operate: '', // 判断符
             *             valueType: '', // 固定值/对应字段/来源api
             *             value: [], // 选择的值
             *         },
             *     ],
             *     // 当nodeList.apiId对应的action为UPDATE时
             *     select: [
             *         {
             *             toEnName: '', // 字段
             *             operate: '', // 判断符
             *             valueType: '', // 固定值/对应字段/来源api
             *             value: [], // 选择的值
             *         },
             *     ],
             *     update: [ 
             *         {
             *             toEnName: '', // 字段
             *             valueType: '', // 固定值/对应字段/来源api
             *             value: [], // 选择的值
             *         },
             *     ],
             *     // 当nodeList.apiId对应的action为DELETE时
             *     delete: [
             *         {
             *             toEnName: '', // 字段
             *             operate: '', // 判断符
             *             valueType: '', // 固定值/对应字段/来源api
             *             value: [], // 选择的值
             *         },
             *     ],
             *     message: { // 通知对象的配置
             *         paasReceiver: '', // 通知对象的信息
             *     },
             * },
             */
        },
    },
    executeWay: { // 触发方式
        way: '', // 触发方式类型
        options: {
            // 事件触发时
            // param: [
            //     {
            //         action: '', // bizActionCode
            //     }
            // ]
            // webhook触发时
            // url: '', // 链接地址
            // paramTemplate: {}, // 配置参数
            // 超时触发时
            // timeOutType: 'duration/point', // 超时类型
            // rule: {
            //     endTimeConfig: {
            //         tsType: 'fixedTime/formTime/dynamicTime', // 时间戳类型
            //         value: 'ts/fieldName/now' // 值
            //     },
            //     startTimeConfig: {
            //         tsType: 'fixedTime/formTime/dynamicTime', // 时间戳类型
            //         value: 'ts/fieldName/now' // 值
            //     },
            //     durationConfig: {
            //         tsType: 'fixedTime/dynamicTime', // 时间戳类型
            //         value: '12/fieldName', // 持续时间
            //         unit: 'm/h/d' // 单位
            //     }
            // }
            // 定时触发时
            // executeType: '', // 触发类型：单次/多次/corn // 这里注意一下是传值是corn，但显示是显示的cron
            // executeTs: '', // 触发时间
            // param: '', // 配置信息
        },
    },
    currentTriggerInfo: {
        triggerWayName: '',
        eventWayInfo: [],
        triggerId: '', // 触发器id
        // name 为触发器名称
        // remarks 为触发器描述
        // triggerWayName: '', // 选择的触发事件名称
        // eventWayInfo: [], // 选择事件触发时所有选中的触发动作名称列表(前端卡片展示用)
    },
    parentNodeApiIdList: [], // 条件节点或执行动作节点时候，之上的所有节点apiId列表
    currentSelectNode: '', // 当前选中的节点 (这是normal_node 的类处理)
    currentSelectNodePanelContentRef: null, // 右侧弹出面板的内容的 ref 组件实例
    _compatibilityList: [], // 兼容列表 如果出现很多很难处理的字段，可以通过添加再次，然后再处理
    buttonStatus: false, // 按钮状态，防止多次点击
});

export default state;
